package com.vueperson.vueperson.t1.CreationalPattern.SingletonPattern.IoDH;

public class Inner_Class {
    private int number=100;

    /**
     * 内部类可以访问其所在类的属性（包括所在类的私有属性），内部类创建自身对象需要先创建其所在类的对象
     */
    //内部类
    private class InnerTest{
        private int number=200;
        public  void t01(){
            int number=300;
            System.out.println(number);
            System.out.println(this.number);
            System.out.println(Inner_Class.this.number);
        }
    }

    /**
     * 可以定义内部接口，且可以定义另外一个内部类实现这个内部接口
     */
    //内部接口
    public interface Fly{
        void doFly();
    }
    public class Inner_interface implements Fly{

        @Override
        public void doFly() {
            System.out.println("I am superMan");
        }
    }

    /**
     * 可以在方法体内定义一个内部类，方法体内的内部类可以完成一个基于虚方法形式的回调操作
     *
     */

    public class Inner_method{
        public M_car getCar(){
            //方法体的内部类
            class BMW extends M_car{
                @Override
                public void paint() {
                    System.out.println("BMW car");
                }
            }
            return new BMW();
        }
    }

     class M_car{
        public void paint(){
            System.out.println("car");
        }
     }

    /**
     * static内部类是内部类中一个比较特殊的情况，Java文档中是这样描述static内部类的：一旦内部类使用static修饰，那么此时这个内部类就升级为顶级类
     *
     */

    //定义static内部类
    public static class Inner_static{
        //static内容类可以定义static元素
        public static void paint(){
            System.out.println("inner?");
        }
    }


    public static void main(String[] args) {
       Inner_Class inner_class=new Inner_Class();
       //内部类调用
       Inner_Class.InnerTest in =inner_class.new InnerTest();
       in.t01();
        //接口调用
       Inner_Class.Inner_interface inf=inner_class.new Inner_interface();
       inf.doFly();

       //方法体内部类调用
        Inner_Class.Inner_method inm=inner_class.new Inner_method();
        inm.getCar().paint();

        //调用静态内部类
        Inner_Class.Inner_static ins=new Inner_Class.Inner_static();
        ins.paint();


    }
}
